#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct Node
{
    ElemType data;
    struct Node *next;
} Node, *Node_t;

// 初始化结构体
bool InitList(Node_t *p)
{
    *p = calloc(1, sizeof(Node));
    if (*p == NULL)
    {
        printf("%s,%d:calloc false\n", __FUNCTION__, __LINE__);
        return false;
    }
    (*p)->next = NULL;
    (*p)->data = 0; // 头结点的数据域用来存储节点的个数
    return true;
}

// 在指定位置插入元素
bool AddList(Node_t p, ElemType n, int m)
{
    if (p == NULL)
    {
        return false;
    }

    Node_t q = p;
    int a = 0;
    // while循环寻找插入节点的前一个节点的位置，p指向插入位置的前一个节点
    while (q->next != NULL && a < m - 1)
    {

        q = q->next;
        a++;

        if (a != m - 1)
        {
            printf("没有找到该节点插入的位置！\n");
            return false;
        }
    }
    // 定义新结点并申请内存
    Node_t newnode = calloc(1, sizeof(Node));
    if (newnode == NULL)
    {
        printf("%s,%d:calloc false\n", __FUNCTION__, __LINE__);
    }
    newnode->data=n;
    newnode->next = q->next;
    q->next = newnode;
    p->data++;
    return true;
}

//删除指定位置的元素
bool DelList(Node_t p,int m)
{
    if (p==NULL)
    {
        return false;
    }
    if (m<=0&&m>p->data)
    {
        return false;
    }
    Node_t q = p->next;
    int num = 1;
    while (num!=m&&num<m-1)
    {
        q = q->next;
        num ++;
    }
    Node_t e = q->next;
    q->next = e->next;
    p->data--;
    return true;
    

}

bool ShowList(Node_t p)
{
    if (p == NULL)
    {
        return false;
    }
    Node_t q=p->next;
    while (q != NULL)
    {
        printf("%d||\t", q->data);
        q = q->next;
    }
    printf("\n");
    return true;
}

int main(int argc, char const *argv[])
{
    // 初始化结构体
    Node_t head = NULL;
    InitList(&head);

    // 在指定位置插入元素
    AddList(head, 1, 1);
    AddList(head, 2, 1);
    AddList(head, 3, 1);
    AddList(head, 4, 1);
    AddList(head, 5, 1);

    //删除指定位置的元素
    DelList(head,2);

    //查询数据
    
    // 遍历
    ShowList(head);
    return 0;
}
